import axios from 'axios';

// 聊天API的基础URL
const API_BASE_URL = 'http://localhost:8080';

/**
 * 发送聊天消息 - 流式接口
 * @param {Object} data 包含modelId, chatId和userPrompt的对象
 * @param {Function} onData 每接收到一段数据时的回调函数
 * @param {Function} onError 发生错误时的回调函数
 * @param {Function} onComplete 完成时的回调函数
 * @returns {Object} 包含abort方法的对象，用于中断请求
 */
export function sendChatMessageStream(data, onData, onError, onComplete) {
    // 创建AbortController用于取消请求
    const controller = new AbortController();

    // 保存响应数据
    let responseText = '';
    // 创建解码器确保正确处理UTF-8字符
    const decoder = new TextDecoder('utf-8');

    console.log('客户端：发送聊天请求，数据:', {
        modelId: data.modelId,
        chatId: data.chatId,
        userPrompt: data.userPrompt.substring(0, 50) + (data.userPrompt.length > 50 ? '...' : '')
    });

    // 发送请求
    axios({
        method: 'post',
        url: `${API_BASE_URL}/v1/chat/stream/sse`,
        data: {
            modelId: data.modelId || 'deepseek-chat',
            chatId: data.chatId,
            userPrompt: data.userPrompt
        },
        // 修改响应类型，使用text代替arraybuffer
        responseType: 'text',
        signal: controller.signal,
        headers: {
            'Content-Type': 'application/json',
            'Accept': 'text/event-stream'
        },
        // 每当接收到新数据块时都会触发
        onDownloadProgress: (e) => {
            console.log('客户端：接收到新数据块', e.event);
            const progressEvent = e.event;
            // 安全地获取响应数据
            if (progressEvent && progressEvent.currentTarget) {
                const response = progressEvent.currentTarget.response;
                console.log('客户端：接收到新数据块', response);
                // 只有当有新数据时才处理
                if (response && response.length > 0) {
                    try {
                        // 不需要解码，直接使用文本
                        const text = response;
                        console.log('客户端：原始响应数据:', text);

                        // 处理SSE格式数据
                        const lines = text.split('\n');
                        let processedText = '';

                        // 记录分割后的行数据，帮助调试
                        console.log(`收到数据分割为${lines.length}行`);
                        if (lines.length < 10) {
                            console.log('所有行内容:', lines);
                        }

                        for (const line of lines) {
                            processedText += line;
                        }

                        // 如果没有找到data:前缀的行，使用原始文本
                        if (!processedText && text.trim()) {
                            processedText = text;
                        }

                        // 清理处理后的文本，移除多余的换行符
                        responseText = processedText.trim();
                        console.log('处理后的响应:', responseText);
                        onData && onData(responseText);
                    } catch (error) {
                        console.error('解析流数据时发生错误:', error);
                        onError && onError(error);
                    }
                }
            }
        }
    })
        .then(() => {
            console.log('请求完成，最终响应长度:', responseText.length);
            onComplete && onComplete();
        })
        .catch((error) => {
            // 如果不是取消请求导致的错误才调用onError
            if (!axios.isCancel(error)) {
                console.error('请求发生错误:', error);
                onError && onError(error);
            }
        });

    // 返回取消请求的方法
    return {
        abort: () => controller.abort()
    };
}

/**
 * 获取健康状态
 * @returns {Promise} 健康状态的Promise
 */
export function getHealthStatus() {
    return axios.get(`${API_BASE_URL}/health`);
} 